package mybatis.interfaces;

import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModelProperty;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

/**
 * 使用 current, size 分页
 *
 */
public interface IPageQueryCondition extends Serializable {

    int DEFAULT_PAGE_CURRENT = 1;
    int DEFAULT_PAGE_SIZE = 10;
    int MAX_PAGE_SIZE = 1000;

    /**
     * 分页查询，current 页码，从1开始, 大于0，缺省1; size 一页的大小，大于0, 缺省10，最大1000; 例如: page[current]=1&page[size]=5 表示 取 第1页的5条数据的数据
     * <p>
     * 备注：为了与SwaggerUI结合，产生Swagger文档
     *
     * @return
     */
    @ApiModelProperty(name = "page[?]", value = "分页查询，current 页码，从1开始, 大于0，缺省1; size 一页的大小，大于0, 缺省10，最大1000; 例如: page[current]=1&page[size]=5 表示 取 第1页的5条数据的数据")
    @JsonIgnore
    default String getPageSwaggerView() {
        return null;
    }

    /**
     * getPage
     *
     * @return
     * @see #getPageSwaggerView
     */
    Map<String, Integer> getPage();

    /**
     * setPage
     *
     * @param page
     * @see #getPageSwaggerView
     */
    void setPage(Map<String, Integer> page);

    /**
     * setPage
     *
     * @param current 当前页码
     * @param size    每页大小
     */
    default void setPage(int current, int size) {
        if (getPage() == null) {
            setPage(new HashMap<>(4));
        }
        getPage().put("current", current);
        getPage().put("size", size);
    }

    /**
     * 是否分页。缺省：true。
     * <p>
     * **当前定义 必须分页**
     *
     * @return
     */
    @ApiModelProperty(hidden = true)
    @JsonIgnore
    default boolean isPaged() {
        return true;
    }

    /**
     * 从 1 开始
     * <p>
     * 缺省 {@link #DEFAULT_PAGE_CURRENT}
     *
     * @return current
     */
    @ApiModelProperty(hidden = true)
    @JsonIgnore
    default int getPageCurrent() {
        return Optional.ofNullable(getPage()).map(map -> map.get("current") == null ? 0 : map.get("current"))
                .filter(current -> current > 0).orElse(DEFAULT_PAGE_CURRENT);
    }

    /**
     * 缺省 {@link #DEFAULT_PAGE_SIZE} , 最大 {@link #MAX_PAGE_SIZE}
     *
     * @return size
     */
    @ApiModelProperty(hidden = true)
    @JsonIgnore
    default int getPageSize() {
        return Optional.ofNullable(getPage()).map(map -> map.get("size") == null ? DEFAULT_PAGE_SIZE : map.get("size"))
                .filter(size -> size > 0 && size <= MAX_PAGE_SIZE).orElse(DEFAULT_PAGE_SIZE);
    }

    /**
     * setPage(null)
     *
     * @see #getPageSwaggerView
     */
    default void clearPage() {
        setPage(null);
    }

    /**
     * isEmptyPage
     *
     * @return
     */
    @ApiModelProperty(hidden = true)
    @JsonIgnore
    default boolean isEmptyPage() {
        return getPage() == null || getPage().isEmpty();
    }
}
